﻿// Euler published the remarkable quadratic formula:
//
// n² + n + 41
//
// It turns out that the formula will produce 40 primes for the consecutive values n = 0 to 39. However, when n = 40, 
// 402 + 40 + 41 = 40(40 + 1) + 41 is divisible by 41, and certainly when n = 41, 41² + 41 + 41 is clearly divisible by 41.
//
// Using computers, the incredible formula  n²  79n + 1601 was discovered, which produces 80 primes for the consecutive 
// values n = 0 to 79. The product of the coefficients, 79 and 1601, is 126479.
//
// Considering quadratics of the form:
//
// n² + an + b, where |a| < 1000 and |b| < 1000
//
//
// where |n| is the modulus/absolute value of n
//          e.g. |11| = 11 and |-4| = 4
//
// Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes 
// for consecutive values of n, starting with n = 0.
//
// Correct answer -59231

#light
open Microsoft.FSharp.Collections

let primeSet = new HashSet<int>(Problem010.getPrimes 4000)

let quadPrimeCount a b =
    let rec inner a b n =
        if primeSet.Contains (n*n + n*a + b)
            then inner a b (n+1)
            else n
    inner a b 0

let scanAll range = 
    let mutable max = 0
    let mutable ab = (0,0)
    for a in -range..range do
        for b in -range..range do 
            let p = quadPrimeCount a b
            if p > max then max <- p; ab <- (a,b)
    (max, ab)

let solve() = 
    let (max, (a,b) ) = scanAll 999
    a * b
    
            
            
            
            
            
        
        